Azure Cloud Shell で Maven 3.6 を Java 11 で動かしてみる
いわさです。
Azure Cloud Shell(bash) では Microsoft Build of OpenJDK 17 がプリインストールされています。
Maven3.6 で Java 11 を使いたかったので、Microsoft Build of OpenJDK 11 をインストールしてみました。
デフォルトは Microsoft OpenJDK 17
Azure Cloud Shell(bash)にアクセスし、mvn
を実行するとJavaのバージョンが出力されています。
本日時点では、v17がデフォルトでセットアップされています。
iwasa_takahito@Azure:~$ mvn -X Apache Maven 3.6.0 Maven home: /usr/share/maven Java version: 17.0.2, vendor: Microsoft, runtime: /usr/lib/jvm/msopenjdk-17-amd64 Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "5.4.0-1078-azure", arch: "amd64", family: "unix" [ERROR] Error executing Maven.
root権限がないので手動インストールしてみた
Azure Cloud Shellではroot権限がない
特定バージョンをインストールしたいところですが、Azure Cloud Shellではroot権限が与えられておらず、パッケージマネージャーなどからのインストールは難しそうです。
iwasa_takahito@Azure:~$ apt-get install openjdk-8-jre E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) iwasa_takahito@Azure:~$ sudo apt-get install openjdk-8-jre bash: sudo: command not found
ダウンロードしてインストールしてみる
回避策として、今回は手動でダウンロードしてインストール出来るかを試してみたいと思います。
Microsoft Build of OpenJDK 11は以下から入手可能です。Linux版(x64)を入手します。
iwasa_takahito@Azure:~$ wget https://aka.ms/download-jdk/microsoft-jdk-11.0.15-linux-x64.tar.gz --2022-05-16 21:22:10-- https://aka.ms/download-jdk/microsoft-jdk-11.0.15-linux-x64.tar.gz Resolving aka.ms (aka.ms)... 104.79.121.189 Connecting to aka.ms (aka.ms)|104.79.121.189|:443... connected. HTTP request sent, awaiting response... 301 Moved Permanently Location: https://download.visualstudio.microsoft.com/download/pr/8309c7e7-a5f7-4f39-9684-7a1dd4994dc6/3bf8cc1a1a0cd7318d006f5d2b3eec32/microsoft-jdk-11.0.15-linux-x64.tar.gz [following] --2022-05-16 21:22:11-- https://download.visualstudio.microsoft.com/download/pr/8309c7e7-a5f7-4f39-9684-7a1dd4994dc6/3bf8cc1a1a0cd7318d006f5d2b3eec32/microsoft-jdk-11.0.15-linux-x64.tar.gz Resolving download.visualstudio.microsoft.com (download.visualstudio.microsoft.com)... 192.229.232.200, 2606:2800:147:ff8:129b:22eb:20b:1347 Connecting to download.visualstudio.microsoft.com (download.visualstudio.microsoft.com)|192.229.232.200|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 192834227 (184M) [application/octet-stream] Saving to: ‘microsoft-jdk-11.0.15-linux-x64.tar.gz’ microsoft-jdk-11.0.15-linux-x64.tar 100%[===================================================================>] 183.90M 238MB/s in 0.8s 2022-05-16 21:22:13 (238 MB/s) - ‘microsoft-jdk-11.0.15-linux-x64.tar.gz’ saved [192834227/192834227] iwasa_takahito@Azure:~$ tar xzvf microsoft-jdk-11.0.15-linux-x64.tar.gz jdk-11.0.15+10/ jdk-11.0.15+10/bin/ jdk-11.0.15+10/bin/jaotc jdk-11.0.15+10/bin/jar jdk-11.0.15+10/bin/jarsigner jdk-11.0.15+10/bin/java jdk-11.0.15+10/bin/javac jdk-11.0.15+10/bin/javadoc jdk-11.0.15+10/bin/javap jdk-11.0.15+10/bin/jcmd jdk-11.0.15+10/bin/jconsole :
Mavenで利用するためにJavaのパスの解決とJAVA_HOMEの設定までを今回はしてみましょう。
iwasa_takahito@Azure:~$ which java /usr/bin/java iwasa_takahito@Azure:~$ ls -l /usr/bin/java lrwxrwxrwx 1 root root 22 Mar 8 18:58 /usr/bin/java -> /etc/alternatives/java iwasa_takahito@Azure:~$ ls -l /etc/alternatives/java lrwxrwxrwx 1 root root 40 Mar 8 18:58 /etc/alternatives/java -> /usr/lib/jvm/msopenjdk-17-amd64/bin/java iwasa_takahito@Azure:~$ echo $JAVA_HOME /usr/lib/jvm/msopenjdk-17-amd64
iwasa_takahito@Azure:~$ ln -sf ~/jdk-11.0.15+10/bin/java /etc/alternatives/java ln: failed to create symbolic link '/etc/alternatives/java': Permission denied iwasa_takahito@Azure:~$ ln -sf ~/jdk-11.0.15+10/bin/java /usr/bin/java ln: failed to create symbolic link '/usr/bin/java': Permission denied
ただし、前述の権限の問題があるので、シンボリックリンクの更新などは行わずにパスは先頭に割り込ませる形にしました。
もうちょっとやりようがありそうですが、今日はMavenにJava11を認識させるところまでをゴールにしているので一旦この形にします。
iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ export JAVA_HOME=/home/iwasa_takahito/jdk-11.0.15+10 iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ export PATH=/home/iwasa_takahito/jdk-11.0.15+10/bin:$PATH iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ echo $PATH /home/iwasa_takahito/jdk-11.0.15+10/bin:~/.local/bin:~/bin:~/.dotnet/tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/istio-latest/bin:/usr/local/linkerd/bin:/usr/local/go/bin:/opt/mssql-tools/bin:~/bundle/bin:~/bundle/gems/bin iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ which java /home/iwasa_takahito/jdk-11.0.15+10/bin/java iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ java --version openjdk 11.0.15 2022-04-19 LTS OpenJDK Runtime Environment Microsoft-32930 (build 11.0.15+10-LTS) OpenJDK 64-Bit Server VM Microsoft-32930 (build 11.0.15+10-LTS, mixed mode)
iwasa_takahito@Azure:~/jdk-11.0.15+10/bin$ mvn -X Apache Maven 3.6.0 Maven home: /usr/share/maven Java version: 11.0.15, vendor: Microsoft, runtime: /home/iwasa_takahito/jdk-11.0.15+10 Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "5.4.0-1078-azure", arch: "amd64", family: "unix" WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release [DEBUG] Created new class realm maven.api [DEBUG] Importing foreign packages into class realm maven.api [DEBUG] Imported: javax.annotation.* < plexus.core [DEBUG] Imported: javax.annotation.security.* < plexus.core :
Maven実行出来ましたね。
さいごに
Azure Cloud Shellの仕様として、マウントされたAzure File Shareを使って$HOMEが永続化されるそうなので、実用的かどうかはともかくインストールだけしておけばMavenを使うタイミングで環境変数でJavaバージョンの切り替えは出来そうかなという所感です。
今回はJavaをセットアップしましたが、Pythonの旧バージョンなどにも応用出来そうです。ランタイムによってはビルドし直さないといけないかもしれないですが。